module(..., package.seeall)
--- 模块功能：MQTT客户端处理框架
-- @author openLuat
-- @module mqtt.mqttTask
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.28
require "misc"
require "mqtt"
require "mqttRestartInMsg"
require "mqttRestartOutMsg"
require "nvm"
-- 初始化nvm获取配置参数
nvm.init("config.lua", true)
-- 参数初始化
local ready = false
-- 获取设备配置参数
local mqttHostHost, mqttPortHost, mqttKeepAliveHost, mqttLoginNameHost,
      mqttLoginPwmHost, mqttTransportHost, clientNo = nvm.get("MqttHostHost"),
                                                      nvm.get("MqttPortHost"),
                                                      nvm.get(
                                                          "MqttKeepAliveHost"),
                                                      nvm.get(
                                                          "MqttLoginNameHost"),
                                                      nvm.get("MqttLoginPwmHost"),
                                                      nvm.get(
                                                          "MqttTransportHost"),
                                                      nvm.get("ClientNo")

--- MQTT连接是否处于激活状态
-- @return 激活状态返回true，非激活状态返回false
-- @usage mqttTask.isReady()
function IsMqttRestartReady() return ready end

-- 启动MQTT客户端任务
sys.taskInit(function()
    local retryConnectCnt, retryStartDevCnt = 0, 0
    -- 创建一个MQTT客户端
    while true do
        if not socket.isReady() then
            retryConnectCnt = 0
            -- 等待网络环境准备就绪，超时时间是5分钟
            sys.waitUntil("IP_READY_IND", 300000)
            log.info("retryStartDevCnt加1")
            retryStartDevCnt = retryStartDevCnt + 1
        end
        if socket.isReady() then
            retryStartDevCnt = 0
            -- 阻塞执行MQTT CONNECT动作，直至成功
            -- 如果使用ssl连接，打开mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})，根据自己的需求配置
            -- mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})
            local mqttClientRestart = mqtt.client(misc.getImei(),
                                                  mqttKeepAliveHost,
                                                  mqttLoginNameHost,
                                                  mqttLoginPwmHost, nil, nil,
                                                  "3.1")
            if mqttClientRestart:connect(mqttHostHost, mqttPortHost,
                                         mqttTransportHost) then
                retryConnectCnt = 0
                ready = true
                -- 订阅主题
                log.info("clientNo", clientNo)
                if mqttClientRestart:subscribe({
                    ["ACS/" .. clientNo .. "/RESTART"] = 0,
                    ["ACS/RESTART"] = 0
                }) then
                    -- 循环处理接收和发送的数据
                    while true do
                        if not mqttRestartInMsg.proc(mqttClientRestart) then
                            log.error("mqttTask.mqttInMsg.proc error")
                            break
                        end
                        if not mqttRestartOutMsg.proc(mqttClientRestart) then
                            log.error("mqttTask.mqttOutMsg proc error")
                            break
                        end
                    end
                end
                ready = false
            else
                retryConnectCnt = retryConnectCnt + 1
            end
            -- 断开MQTT连接
            mqttClientRestart:disconnect()
            if retryConnectCnt >= 5 then
                link.shut()
                retryConnectCnt = 0
            end
            sys.wait(500)
        else
            -- 进入飞行模式，20秒之后，退出飞行模式
            net.switchFly(true)
            sys.wait(20000)
            net.switchFly(false)
        end
        if retryStartDevCnt >= 7 then
            retryStartDevCnt = 0
            sys.restart("重启设备！")
        end
    end
end)
